﻿/**
* jQuery EasyUI 1.4.3
* Copyright (c) 2009-2015 www.jeasyui.com. All rights reserved.
*
* Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
* To use it on other terms please contact us at info@jeasyui.com
* http://www.jeasyui.com/license_commercial.php
*
* jQuery EasyUI form 组件扩展
* jeasyui.extensions.datagrid.autoFocus.js
*
* 依赖项：
*   1、jquery.jdirk.js
*/
(function () {

    $.util.namespace("$.fn.form.extensions");

    var getControlElements = function (target) {
        var rCRLF = /\r?\n/g,
            rsubmitterTypes = /^(?:submit|button|image|reset)$/i,
            rsubmittable = /^(?:input|select|textarea|keygen)/i;

        var targetJq = $(target);
        var list2 = targetJq.map(function () {
            var elements = jQuery.prop(this, "elements");
            return $.merge([], elements ? $.makeArray(elements) : $(this).find("*"));
        });
        //console.log("******容器map结果********");
        //console.log(list2);
        var list3 = list2.filter(function () {
            //此处应过滤出 可见的input，但easyui渲染input时会这样处理：
            //1、移除原input中的name属性，并隐藏原input
            //2、用原input的name属性，创建一个hidden控件，该input表示控件的value存储容器（序列化时取这个value）
            //3、创建一个可视的input，该input没有name属性
            //步骤3中创建的可视input就是需要过滤出来的dom
            return !$(this).is(":disabled") && !$(this).is(":hidden") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(this.type);
        });
        //console.log("******过滤结果********");
        //console.log(list3);
        return list3;
    };

    var getButtonElements = function (target) {
        var targetJq = $(target);
        var list2 = targetJq.map(function () {
            return $.merge([], $(this).find("a"));
        });
        //console.log("******容器map结果1********");
        //console.log(list2);
        var list3 = list2.filter(function () {
            //此处应过滤出 可用的easyui-linkbutton （暂不考虑其他按钮，你可以补其他按钮的识别，比如常规的button标签、input-button标签）
            var state = $.data(this, "linkbutton"), options = state ? state.options : undefined;
            return options && !options.disabled && !$(this).is(":hidden");
        });
        //console.log("******过滤结果2********");
        //console.log(list3);
        return list3;
    };

    var autoFocus = function (controlList, index, e, buttonList) {
        if (e.which == 13) {
            var len = controlList.length;
            if ((index + 1) < len) {
                controlList[index + 1].focus();
            }
            else if ((index + 1) == len) {
                if (buttonList && buttonList.length) {
                    //为防止 linkbutton 不存在href属性导致无法聚焦，先检验href属性
                    var btn = $(buttonList[0]), href = btn.attr("href");
                    if ($.string.isNullOrWhiteSpace(href)) { btn.attr("href", "javascript:void(0)"); }
                    btn.focus();
                }
            }
        }
    };

    var enableAutoFocus = function (target) {
        var list3 = getControlElements(target),
            list4 = getButtonElements(target), state = $.data(target, "form"), opts = state ? state.options : undefined, btnSelector = opts ? $(opts.autoFocusBtn) : $(), btnExist = btnSelector.length > 0;
        list3.each(function (index, el) {
            $(el).bind("keydown.autoFocus", function (e) { autoFocus(list3, index, e, btnExist ? btnSelector : list4); });
        });
    };

    var disableAutoFocus = function (target) {
        var list3 = getControlElements(target);
        list3.unbind("keydown.autoFocus");
    };

    var focusFirstControl = function (target) {
        var list = getControlElements(target);
        if (list.length) {
            list[0].focus();
        }
    };

    var methods = $.fn.form.extensions.methods = {

        //  扩展 easyui-form 的自定义方法；开启表单内的控件回车后自动定位到下一个控件的功能：
        //  返回值：返回表示当前 easyui-form 控件的 jQuery 链式对象；
        enableAutoFocus: function (jq) { return jq.each(function () { enableAutoFocus(this); }); },

        //  扩展 easyui-form 的自定义方法；关闭表单内的控件回车后自动定位到下一个控件的功能：
        //  返回值：返回表示当前 easyui-form 控件的 jQuery 链式对象；
        disableAutoFocus: function (jq) { return jq.each(function () { disableAutoFocus(this); }); },

        //  扩展 easyui-form 的自定义方法；定位到第一个控件：
        //  返回值：返回表示当前 easyui-form 控件的 jQuery 链式对象；
        focusFirstControl: function (jq) { return jq.each(function () { focusFirstControl(this); }); }
    };

    var defaults = $.fn.form.extensions.defaults = {

        //  扩展 easyui-form 的自定义属性；表示当 开启回车定位（调用 enableAutoFocus ） 功能后，表单内的最后一个输入框控件回车后将要自动定位的按钮的选择器表达式；
        //  默认值为 null；当 $(autoFocusBtn) 不存在对象时，则自动指向表单中第一个 easyui-linkbutton 按钮对象。
        autoFocusBtn: null
    };

    $.extend($.fn.form.defaults, defaults);
    $.extend($.fn.form.methods, methods);

})(jQuery);